迷宫问题(栈,递归,队列)

这个迷宫问题的解答,主要参考了《LINUX一站式编程》中的第12章“栈与队列”的正文和习题。

 假设有这样一个迷宫,用一个5*5的数组来表示,其中0表示有路可走,1表示无路可走。那么,如何找到一个通路,使得可以从左上角的(0,0)点走到右下角的(4,4)点?

迷宫
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0


分成三个办法来解决这个问题。堆栈,递归和队列。

第一种,使用堆栈进行深度优先搜索。堆栈的先进后出实现了深度优先搜索。其中,如果一个点被探测过了,就标记为2,避免以后重复探索。为了记载历史路径信息,使用了predecessor数组。代码和解如下:

//堆栈版迷宫问题
struct point{int row, col;} stack[512];
int top = 0;
int LEN=5;
int maze[5][5] = {
    0,1,0,0,0,
    0,1,0,1,0,
    0,0,0,0,0,
    0,1,1,1,0,
    0,0,0,1,0,
 };
void push(struct point p)
{
    stack[top++] = p;
    return;
}
struct point pop()
{
    return stack[--top];
}
int is_empty()
{
    return top == 0;
}
void print_maze()
{
    int i,j;
    for(i=0;i<LEN;i++)
    {
        for(j=0;j<LEN;j++)
            printf("%d",maze[i][j]);
        putchar('\n');
    }
    printf("**********\n");
}
struct point predecessor[5][5] = {
    {
  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {
  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {
  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {
  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
    {
  {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}},
};
void visit (int row, int col, struct point pre)
{
    struct point visit_point = {row, col};
    maze[row][col] = 2;
    predece
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值